~ | & ^ << >>
这些都是按位运算,什么意思?就是一位一位的进行运算。
所以 ! 和 ~ 是不同的。
基本的操作:
and ----- &
or ----- |
取反 ----- ~
异或 ----- ^
同或 ----- ~(^) // 异或后求反
<<(左移) >>(右移)
(真值表很容易在网上搜到,就不列了)
这5个基本的运算可以求出很多意想不到的东西。
下面是一些自己总结的:
一般位运算分为:取位操作、改位操作、功能性的操作。
取出某个数的某一位:
get_bit
bool get_bit(int t,int x) {
// 在 t 中,取出第 x 位 --从零开始
return t & (1<<(x));
}
取出最低位:
lowbit()
#define lowbit(x) x & (-p)
改位:
change_bit()
//return int !
// 设置 x 的第 ith 位为 bool
#define set_bit(x,ith,bool) ((bool)?((x)|(1<<(ith))):((x)&(~(1<<(ith)))));
// 设置 x 的从第 ith 位起连续 k 位 为bol
int set(int x,int ith,int k,int bol)
{
while(k --)x = set_bit(x,ith+k,bol);
return x;
}
要回寝室了,明天继续总结!
11.11.21 10:00 补充:
摘自USACO的summary
a |= 0x20; /* turn on bit 0x20 */
a &= ~0x20; /* turn off bit 0x20 */
a ^= 0x20; /* toggle bit 0x20 */
if (a & 0x20) {
/* then the 0x20 bit is on */
}
一个位运算的地址:http://www.matrix67.com/blog/archives/266